package config

import (
	"errors"
	"flag"
	"fmt"
	"os"

	"gopkg.in/yaml.v3"
)

var (
	Conf       ConfStruct
	ConfigFile = flag.String("c", "config.yaml", "config file")
)

// yaml 配置文件结构
type ConfStruct struct {
	DB struct {
		Host      string `yaml:"host"`
		Port      uint   `yaml:"port"`
		User      string `yaml:"user"`
		Name      string `yaml:"name"`
		Password  string `yaml:"password"`
		Prefix    string `yaml:"prefix"`
		ZoneTime  string `yaml:"zoneTime"`
		Debug     bool   `yaml:"debug"`
		SqlLogger bool   `yaml:"sqlLogger"`
	} `yaml:db`
	Router struct {
		Port string `yaml:"port"` // 接口端口号
	} `yaml:router`
}

// 初始化配置文件
func Init() {
	Config()
	// 解析命令行标志
	flag.Parse()

	// 从配置文件中读取内容
	source, err := os.ReadFile(*ConfigFile)
	if err != nil {
		// 如果读取文件出错，打印错误并终止程序
		fmt.Println("read config file err:", err)
		panic(err)
	}

	// 将读取到的 YAML 配置内容解析到 Conf 中，可供外部调用
	err = yaml.Unmarshal(source, &Conf)
	if err != nil {
		// 如果解析配置出错，打印错误并终止程序
		fmt.Println("config init err:", err)
		panic(err)
	}
}

func Config() {
	// 尝试读取config.yaml文件
	data, err := os.ReadFile(*ConfigFile)
	if err != nil {
		// 如果文件不存在，创建并写入默认内容
		if os.IsNotExist(err) {
			Conf.Router.Port = "50000"

			Conf.DB.Host = "localhost"
			Conf.DB.User = "root"
			Conf.DB.Name = "DDtest"
			Conf.DB.Password = "123456"
			Conf.DB.ZoneTime = "Asia/Shanghai"
			Conf.DB.Prefix = "prefix"
			Conf.DB.Port = 3306
			Conf.DB.Debug = false
			Conf.DB.SqlLogger = true
			fileContent, _ := yaml.Marshal(&Conf)
			os.WriteFile(*ConfigFile, fileContent, 0644)
			fmt.Printf("\n未找到配置文件，已创建默认配置文件，请修改后重新启动！\n")
		}
	}

	// 解析yaml内容
	yaml.Unmarshal(data, &Conf)
}

func GetConf() (config ConfStruct, err error) {
	configFilePath := "config.yaml"

	// 尝试读取config.yaml文件
	data, err := os.ReadFile(configFilePath)
	if err != nil {
		return config, errors.New("配置文件不存在")
	}

	// 解析yaml内容
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		return config, errors.New("解析配置文件失败")
	}
	return config, nil
}
